package br.com.werp.regras.pessoa.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.DependenteVO;
import br.com.werp.regras.geral.vos.pessoa.DependeteHistoricoVO;
import br.com.werp.regras.geral.vos.tabelas.Dependente;

import org.apache.commons.collections.CollectionUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;

import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Created on 09/06/2005
 */
public class DependenteDAO extends MasterDAO {
    private static final String IDS_DEPENDETES = "IDS_DEPENDETES";
    private static final String DEPD_FISICA = "DEPD_FISICA";
    private static DependenteDAO dependenteDAO;

    /**
     * @param banco
     * @throws Exception
     */
    private DependenteDAO(String banco) throws Exception {
        super(banco);
    }

    public static DependenteDAO getDependenteDAO() throws Exception {
        if (dependenteDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            dependenteDAO = new DependenteDAO(bundle.getString(Constantes.BANCO));
        }

        return dependenteDAO;
    }

    public boolean verificaExisteDependencia(int contribuinteId,
        int dependenteId, Object key) throws Exception {
        Connection conn = validarTransacao(key);
        String where = " depd_contribuinte = " + contribuinteId +
            " and depd_fisica =" + dependenteId;
        List dependentes = preencheVO(conn, new Dependente(), where);

        if (dependentes.isEmpty()) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * retorna uma lista de dependente
     * @param Depd_fisica
     */
    public List obterHistoricosDependetes(int depd_contribuinte,
        int depd_fisica, String status) throws Exception {
        Connection conn = getConexao();

        try {
            String where = "Depd_fisica = " + depd_fisica +
                " and depd_contribuinte = " + depd_contribuinte;

            if (status != null) {
                where += (" and Depd_status = '" + status + "'");
            }

            return preencheVO(conn, new DependenteVO(), "dependente", where,
                Arrays.asList(
                    new String[] {
                        "depd_data_inicio", "depd_data_limite",
                        "depd_contribuinte", "depd_id", "depd_fisica",
                        "depd_status"
                    }));
        } finally {
            liberaConeccao(conn);
        }
    }

    public void inserirDependentesHostorico(Object conn, Dependente dependente)
        throws Exception {
        Connection connection = validarTransacao(conn);
        inserirVO(connection, dependente, new String[] { "depd_id" });
    }

    public void inserirDependente(Dependente dependente, Object key)
        throws Exception {
        Connection conn = validarTransacao(key);
        inserirVO(conn, dependente, new String[] { "Depd_id" });
    }

    public List obterDependentesIR(Dependente dependente)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            return pesquisarVO(conn, dependente);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List pesquisarDependeteHistoricoVO(DependeteHistoricoVO dependenteVO)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            return pesquisarVO(conn, dependenteVO, "", "dependente",
                DependeteHistoricoVO.excluidas);
        } finally {
            liberaConeccao(conn);
        }
    }

    public List pesquisarDependenteVO(DependenteVO dependenteVO)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            String tabelas = "pessoa,fisica,dependente";
            String where = " and pess_id = fisc_pessoa and pess_id = depd_fisica";

            if (!Util.isNullOrEmpty(dependenteVO.getPess_nome())) {
                where += (" and pess_nome like " +
                aspasLike(dependenteVO.getPess_nome()));
                dependenteVO.setPess_nome(null);
            }

            return pesquisarVO(conn, dependenteVO, where, tabelas,
                DependenteVO.EXCLUIDAS);
        } finally {
            liberaConeccao(conn);
        }
    }
}
